package main

import (
	"fmt"
	"gopkg.in/ini.v1"
	"os"
)

// 注意！！！！！！！这里不能用小写
type DataSource struct {
	//db_drive_name      string
	Host     string `ini:"host"`
	Port     int    `ini:"port"`
	Username string `ini:"username"`
	Password string `ini:"password"`
	//max_open_conn      int
	//max_idle_conn      int
	//conn_max_life_time int
}

func main() {
	//file := utils.LoadConfigFile("/Users/yuliao.chen/go/src/go_entry_task/entry_core/src/config/dev.ini")
	cfg, err := ini.Load("/Users/yuliao.chen/go/src/go_entry_task/entry_core/src/config/dev.ini") //初始化一个cfg
	//cfg, err := ini.Load("my.ini") //初始化一个cfg
	if err != nil {
		fmt.Printf("Fail to read file: %v", err)
		os.Exit(1)
	}

	//cfg, err := ini.Load("path/to/ini")
	// ...
	//dataSource := new(DataSource) //初始化一个结构体，返回指向他的指针
	//err = cfg.MapTo(dataSource)
	//
	// 一切竟可以如此的简单。
	//err = ini.MapTo(dataSource, "/Users/yuliao.chen/go/src/go_entry_task/entry_core/src/config/dev.ini") //核心代码

	// 嗯哼？只需要映射一个分区吗？
	n := new(DataSource)
	err = cfg.Section("mysql").MapTo(n)
	fmt.Printf("%v\n", n)

	//
	//// 典型读取操作，默认分区可以使用空字符串表示
	fmt.Println("host:", cfg.Section("mysql").Key("host").String())
	//fmt.Println("Data Path:", cfg.Section("paths").Key("data").String())
	//
	//// 我们可以做一些候选值限制的操作
	//fmt.Println("Server Protocol:",
	//	cfg.Section("server").Key("protocol").In("http", []string{"http", "https"}))
	//// 如果读取的值不在候选列表内，则会回退使用提供的默认值
	//fmt.Println("Email Protocol:",
	//	cfg.Section("server").Key("protocol").In("smtp", []string{"imap", "smtp"}))
	//
	//// 试一试自动类型转换
	//fmt.Printf("Port Number: (%[1]T) %[1]d\n", cfg.Section("server").Key("http_port").MustInt(9999))
	//fmt.Printf("Enforce Domain: (%[1]T) %[1]v\n", cfg.Section("server").Key("enforce_domain").MustBool(false))
	//
	//// 差不多了，修改某个值然后进行保存
	//cfg.Section("").Key("app_mode").SetValue("production")
	//cfg.SaveTo("my.ini.local")
}
